package com.hzit.servlet;

import cn.hutool.core.util.StrUtil;
import com.hzit.entity.Cart;
import com.hzit.entity.Product;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@WebServlet("/cart")
public class CartServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1. 得到请求参数
		String cmd = req.getParameter("cmd");
		//2. 根据参数调用不同的方法
		if(StrUtil.isNotBlank(cmd)){
			if("addCart".equals(cmd)){      // 添加到购物车
				addCart(req,resp);
			}
			if("remove".equals(cmd)){       // 移除购物车
				remove(req,resp);
			}
			if("clear".equals(cmd)){        // 清空购物车
				clear(req,resp);
			}
		}
	}


	//2. 添加到购物车
	private void addCart(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//第一部分：根据商品id在商品列表集合中查询出商品
		Product product = getProduct(req);
		//第二部分：将商品放到购物车中
		//2.1 获取session对象
		HttpSession session = req.getSession();
		//2.2 从session中取得购物车集合
		Cart cart = (Cart) session.getAttribute("cart");
		//2.3 如果是第一次获取，就构造出一个新的购物车对象
		if(cart == null){
			cart = new Cart();
		}
		//2.4 将商品添加到购物车中
		cart.addCart(product);
		//2.5 将cart添加到session中
		session.setAttribute("cart",cart);
		//2.6 跳转到购物车列表页面展示
		resp.sendRedirect("/cart_list.jsp");
	}
	//3. 根据商品id在商品列表中查询出商品并返回
	private Product getProduct(HttpServletRequest req) {
		//3.1 得到需要添加的商品id
		String pid = req.getParameter("pid");
		//3.2 得到所有商品列表
		//3.2.1 得到application对象
		ServletContext servletContext = req.getServletContext();
		//3.2.2 在application对象中取得products对象集合
		List<Product> products = (List<Product>) servletContext.getAttribute("products");
		//3.2.3 在list集合中根据pid查询出商品
		Product product = null;
		for (Product p : products) {
			if(p.getPid().intValue() == Integer.parseInt(pid)){
				product = p;
				break;
			}
		}
		return product;
	}

	/**
	 * 4. 移除购物项商品
	 * 业务分析：
	 *    ① 将商品恢复库存
	 *    ② 将商品从购物车中移除
 	 */
	private void remove(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//4.1 根据商品id查询出商品
		Product product = getProduct(req);
		//4.2 获取购物车对象
		HttpSession session = req.getSession();
		Cart cart = (Cart) session.getAttribute("cart");
		//4.3 从购物车移除商品
		cart.removeCart(product);
		//4.4 将购物车重新放回session
		session.setAttribute("cart",cart);
		//4.5 重新跳转回购物车列表页面
		resp.sendRedirect("/cart_list.jsp");
	}

	/**
	 * 5. 清空购物车
	 * 业务分析：
	 *   ① 所有的购物车的购物项的恢复库存
	 *   ② 清空购物车
	 */
	private void clear(HttpServletRequest req, HttpServletResponse resp)  throws ServletException, IOException {
		//5.1 得到购物车对象
		Cart cart = (Cart) req.getSession().getAttribute("cart");
		//5.2 得到原来的商品集合
		List<Product> products = (List<Product>) req.getServletContext().getAttribute("products");
		//5.2 清空购物车
		cart.clear(products);
		//5.3 重新跳转回购物车列表页面
		resp.sendRedirect("/cart_list.jsp");
	}

}
